// -*- Mode: Java -*-
// This is a Plexil plan for the RoboSim application.  It has the robot
// move one step in each direction.  The plan is successful if and only
// if the start and end positions of the robot are the same.

// Copyright (c) 2006-2010, Universities Space Research Association (USRA).
//  All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of the Universities Space Research Association nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY USRA ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL USRA BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
// TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Real[3] Command QueryRobotState(String name);
Integer Command MoveLeft(String name);
Integer Command MoveRight(String name);
Integer Command MoveUp(String name);
Integer Command MoveDown(String name);

FourSteps:
{
	String RobotName = "RobotYellow";
	Real StartX, StartY, EndX, EndY;

	PostCondition (StartX == EndX) && (StartY == EndY);

    GetStartPosition:
    {
		Real RobotState[3];
		GetRobotState:
        { 
			EndCondition isKnown(RobotState[0]);
			RobotState = QueryRobotState(RobotName);
        }
		StartX = RobotState[0];
		StartY = RobotState[1];
    }
    MoveLeft:
    {
        Integer result;
        EndCondition isKnown(result);
        PostCondition result == 1;
        result = MoveLeft(RobotName);
    }
    MoveUp:
    {
        Integer result;
        EndCondition isKnown(result);
        PostCondition result == 1;
        result = MoveUp(RobotName);
    }
    MoveRight:
    {
        Integer result;
        EndCondition isKnown(result);
        PostCondition result == 1;
		result = MoveRight(RobotName);
    }
    MoveDown:
    {
        Integer result;
        EndCondition isKnown(result);
        PostCondition result == 1;
        result = MoveDown(RobotName);
    }
    GetEndPosition:
    {
		Real RobotState[3];
        GetRobotState:
        { 
			EndCondition isKnown(RobotState[0]);
			RobotState = QueryRobotState(RobotName);
        }
		EndX = RobotState[0];
		EndY = RobotState[1];
    }
}
